﻿using System.Collections;
using UnityEngine;

public class Player : MonoBehaviour {

  // Spaceship组件
  Spaceship spaceship;

  IEnumerator Start () {
    // 获取Spaceship组件
    spaceship = GetComponent<Spaceship> ();

    while (true) {

      spaceship.Shot (transform);
      // GetComponent<AudioSource> ().Stop ();
      GetComponent<AudioSource> ().Play ();

      yield return new WaitForSeconds (spaceship.shotDelay);
    }
  }

  void Update () {
    // 右・左
    float x = Input.GetAxisRaw ("Horizontal");

    // 上・下
    float y = Input.GetAxisRaw ("Vertical");

    Vector2 direction = new Vector2 (x, y).normalized;

    // 因为Rigidbody的velocity更新比Update的生命周期靠前
    // 所以用velocity更新了坐标之后，再进行位移限制会在统一帧有两次移动的bug
    // 所以我们为了统一移动，放弃Rigidbody的velocity 改为直接操作Transform里的postion
    //spaceship.Move (direction);

    // 移动 且限制移动范围
    Move (direction);

  }

  void Move (Vector2 direction) {

    Vector2 min = Camera.main.ViewportToWorldPoint (new Vector2 (0, 0));

    Vector2 max = Camera.main.ViewportToWorldPoint (new Vector2 (1, 1));

    // 获取Player的坐标
    Vector2 pos = transform.position;

    // 增加移动量
    pos += direction * spaceship.speed * Time.deltaTime;

    // 限制玩家在画面中的位置
    pos.x = Mathf.Clamp (pos.x, min.x, max.x);
    pos.y = Mathf.Clamp (pos.y, min.y, max.y);

    // 更新位置为限制后的位置
    transform.position = pos;
  }

  // 把玩家限制在屏幕范围之内
  /*void Clamp () {
    // 通过主摄像头的View Port 获取摄像头中世界坐标的最小和最大值
    Vector2 min = Camera.main.ViewportToWorldPoint (new Vector3 (0, 0, 0));
    Vector2 max = Camera.main.ViewportToWorldPoint (new Vector3 (1, 1, 0));

    // Debug.Log("min:" + min);
    // Debug.Log("max:" + max);

    // Debug.Log("Mathf.Clamp(101,1,100)");
    // Debug.Log(Mathf.Clamp(101,1,100));
    // Mathf.Clamp(101,1,100); // 返回结果是100

    // Debug.Log("Mathf.Clamp(0,1,100)");
    // Debug.Log(Mathf.Clamp(0,1,100));

    // Mathf.Clamp(0,1,100); // 返回结果是1

    // 获取玩家当前坐标
    Vector3 pos = transform.position;
    // 生成被限制后的坐标
    pos.x = Mathf.Clamp (pos.x, min.x, max.x);
    pos.y = Mathf.Clamp (pos.y, min.y, max.y);
    // 用限制后坐标来取代玩家坐标
    transform.position = pos;
  }*/

  // 如果我们的游戏对象实现了Collder组件且is Trigger被设定成ture的话 会实现以下三个事件函数
  //「OnTriggerEnter2D」(当接触/被撞到)「OnTriggerStay2D」(停留在)「OnTriggerExit2D」(退出以后)

  void OnTriggerEnter2D (Collider2D other) {

    //  1:Player的子弹和Player不会发生碰撞
    //  2:Enemy的子弹和Enemy不会发生碰撞
    //  3:Player的子弹和Enemy的子弹不会发生碰撞
    //  4:Player的Player的子弹之间不会发生碰撞
    //  5:Enemy的Enemy的子弹之间不会发生碰撞
    //  6:Enemy之间不会发生碰撞
    //  7:Player之间不会发生碰撞
    // 我们通过project settings 里的 layer的真值表可以控制碰撞关系

    // 排除掉销毁区域的碰撞
    string layerName = LayerMask.LayerToName (other.gameObject.layer);

    if (layerName == "DestroyArea") {
      return;
    }

    // 把碰到的敌人子弹销毁掉
    Destroy (other.gameObject);

    // 播放爆炸动画
    spaceship.PlayExplosion ();

    // 销毁自己（被打死了）
    Destroy (gameObject);


    FindObjectOfType<Manager>().GameOver();

  }

  /*void OnTriggerEnter2D (Collider2D c) {

      // 获取图层名
        string layerName = LayerMask.LayerToName(c.gameObject.layer);

        // 图层名是Bullet (Enemy)的时候削除子弹
        if( layerName == "Bullet(Enemy)")
        {
            // 削除弾
            Destroy(c.gameObject);
        }

        // 图层名是Bullet (Enemy)或者Enemy的場合进行爆発
        if( layerName == "Bullet(Enemy)" || layerName == "Enemy")
        {
            // 爆発する
            spaceship.Explosion();

            // プレイヤーを削除
            Destroy (gameObject);
        }
    
  }*/

}